项目入手整体介绍 项目架构亮点学习方法

前提概要

对于Java程序员来说,项目的重要性已经是不言而喻了,无论是在简历、面试、工作的技能提升可以说是最重要的,很多人学习的项目可以说是只是个demo级别,和生产实际的项目相比,确实太小儿科。有的人确实是在工作中做了项目的开发,但平时也都是常规的CRUD,可以说毫无亮点。

相信有不少人就遇到这种情况,学了很多设计模式,但在实际开发项目时根本用不到,时间长了也就忘了,对于Java中的抽象,解耦这种设计思想更是一知半解,人人都说解耦,但又有多少人真正学会了解耦呢

还有面试要背的八股文,如果八股文不能真正应用到项目中,始终就不能真正的掌握了八股文,八股文一定是要理解在项目中实践应用的,绝不是死记硬背,否则面试只要深入一问就会傻眼

介绍

针对于目前对于Java程序员来说最重要的就是缺少有价值的项目,大家应该都知道谷粒商城、瑞吉外卖这两个项目,现在这两个项目实在是太多太多人来用了,光我在面试应聘者时,听得最多的项目就是这两个,以至于现在面试官一看到是电商项目,就直接跳过,电商真的是烂大街了,建议大家也不要再把电商写在简历上了,如果实际做过电商可以写上去。简历投出去就没有回应了,这种体验相信大家一定体会过

在开发大麦网项目的原因就是在此,可以说大麦网项目是本人付出相当多的心血和精力来开发的,从业务上来说是提供用户购票功能,其中的亮点就是高并发下的演唱会抢票,以及使用目前流行的SpringCloud以及SpringCloudAlibaba的架构,在应对高并发业务时,使用了各种具有亮点的技术方案,并且这些技术方案都是在实际生产中应用的,就比如对常说的分布式锁都进行了充分的优化,考虑到锁的粒度、锁的网络消耗、锁的事务问题等都有考虑

在设计缓存时,不单单只是常规的使用Redis,因为在百万并发的流量请求下,Redis也是扛不住的,如果是同一个产品的情况,Redis的集群也起不到作用。也容易造成缓存雪崩的问题。所以在大麦项目中设计了多层缓存的架构设计,来解决此问题。 除了上述的多级缓存架构设计,还进行了双重判定以及锁的优化设计,来应对突发性热点数据暴增大致系统压力过大的问题

项目中也充分体现了 高内聚低耦合 的思想,设计了多模块架构,并且也使用了多种设计模式:如策略、模板、责任链、组合、观察者、命令等,而且真正生产中的项目绝不是只是把接口数据提供了就完事的,要考虑的细节非常的多,本项目中完善了生产环境中要考虑的各种细节的配置

而项目的讲解过程中,不仅有细致的文档介绍、还有以及详细的代码注释、以及流程清晰的流程图。这都是为了让大家能更加容易的掌握项目 这只是罗列出一部分的流程图

image-91b77344

适合学习大麦项目的人群是很广泛的,无论是刚接触Java或者工作了多年的小伙伴都可以学习。对于学习了Java后需要项目的小伙伴来说可以快速掌握真实生产环境的项目,对于工作几年想提高技术能力,面试也想有亮点的小伙伴来说可以学习高并发的解决方案以及架构设计和设计模式的提升

整体内容介绍

组件架构

针对于分布式和微服务的项目来说,随着业务的发展,项目的数量上千个都是很正常的,但如何要把这些项目做好配置,做好架构设计,设计出组件库,都是要考虑的因素

这里可能有人不知道组件库的作用,举一个例子:就比如说分布式锁,在以前的单体服务中,直接设计好分布式锁代码,然后业务使用就可以了。但这上千的项目每个都要写一遍分布式锁的实现吗?很明显不现实。这就需要将分布式锁的逻辑单独抽取成一个公共的项目,其他的服务项目来通过maven坐标来依赖这个公共的分布式锁项目,这样可以提高代码的复用性,以及提高团队的开发效率

既然组件库是要给其他服务提供使用,所以在设计时要考虑的细节非常的多,设计模式和高内聚低耦合的思想更加的重要,而且代码的健壮性和高效率的执行也是同样重要,而在大麦项目中,使用了SpringBoot的自动装配机制来设计组件库

除了组件库外,还有对异常的处理、数据的封装格式、多线程的使用等等也都要进行相应的封装设计,这些在项目中同样具备

image-2ac78884

业务流程

对于大麦项目来说,核心的业务就是用户选择节目然后进行购票功能了,项目中不仅完整了对整个业务流程的完整闭环,而且考虑到既然设计此项目是为了应对高并发的特点,那么在从业务的角度上也做了很多的优化设计,比如: ●根据业务特点如何选择合适的分库分表的分片 ●如何结合图形验证码和布隆过滤器防止缓存穿透 ●如何使用本地锁和分布式锁来实现对锁的优化来应对高并发下的购票压力 ●如何设置灵活的规则应对防刷行为 ●... ..

image-1645d72f

项目讲解服务目录

本人对项目进行了极为细致的讲解,包括了多个维度:概要介绍、如何启动、基础讲解、生产环境中的配置、详细的业务流程、涉及的架构基础组件、涉及到的技术讲解、项目的系列亮点

image-5803ff17

项目的骨架目录介绍

● damai-captcha-manage-framework   验证码组件模块
  ○ damai-base-captcha 验证码基础组件
  ○ damai-captcha-framework   验证码封装组件
● damai-common   公共基础包
● damai-elasticsearch-framework   elasticsearch封装组件
● damai-id-generator-framework   分布式id生成器
● damai-redis-tool-framework   redis相关组件
  ○ damai-redis-common-framework redis公共配置模块
  ○ damai-redis-framework redis操作封装组件
  ○ damai-redis-stream-framework redisStream操作封装组件
● damai-redisson-framework   redisson封装组件
  ○ damai-redisson-service-framework   redisson服务相关组件
    ■ damai-bloom-filter-framework   布隆过滤器组件
    ■ damai-redisson-common-framework   公共配置包
    ■ damai-repeat-execute-limit-framework   防重复幂等组件
    ■ damai-service-lock-framework   分布式锁组件
  ○ damai-service-delay-queue-framework   延迟队列组件
● damai-server   业务服务
  ○ damai-admin-service   admin服务监控
  ○ damai-base-data-service   基础数据服务
  ○ damai-customize-service   定制化服务
  ○ damai-gateway-service   Gateway网关服务
  ○ damai-mybatis-plus-service   Mybatisplus生成器
  ○ damai-order-service   订单服务
  ○ damai-pay-service   支付服务
  ○ damai-program-service   节目服务
  ○ damai-single-service   单体服务
  ○ damai-user-service   用户服务
● damai-server-client   业务服务的Feign调用
  ○ damai-base-data-client  基础数据服务的Feign调用
  ○ damai-customize-client   定制化服务的Feign调用
  ○ damai-order-client   订单服务的Feign调用
  ○ damai-pay-client   支付服务的Feign调用
  ○ damai-program-client   节目服务的Feign调用
  ○ damai-user-client   用户服务的Feign调用
● damai-spring-cloud-framework   微服务相关封装组件
  ○ damai-service-common  服务公共包
  ○ damai-service-component  微服务公共包
  ○ damai-service-gray-transition-framework   灰度功能组件
  ○ damai-service-hystrix   Hystrix熔断插件
  ○ damai-service-initialize   服务初始化行为管理组件
● damai-thread-pool-framework   线程池封装组件
● logs   日志存放目录
● sql   导入的数据库表和数据

项目的技术架构介绍

技术架构图

image-f66f4dfa

技术架构选型

技术 说明 官网
Spring-Boot Web服务框架 https://spring.io/projects/spring-boot
Spring-Cloud 微服务框架 https://spring.io/projects/spring-cloud
Spring-Cloud-alibaba alibaba微服务框架 https://github.com/alibaba/spring-cloud-alibaba
Spring-Cloud-Gateway 微服务网关 https://spring.io/projects/spring-cloud-gateway
Nacos 服务注册中心 https://nacos.io/zh-cn/index.html
Sentinel 服务熔断 https://sentinelguard.io/zh-cn/
Log4j2 日志框架 https://github.com/apache/logging-log4j2
Mysql 数据库 https://www.mysql.com/
MyBatis-Plus ORM框架 https://baomidou.com
MyBatisGenerator 数据层代码生成器 http://www.mybatis.org/generator/index.html
AJ-Captcha 图形验证码 https://gitee.com/anji-plus/captcha
Kafka 消息队列 https://github.com/apache/kafka/
Redis 分布式缓存 https://redis.io/
Redisson 分布式Redis工具 https://redisson.org
Elasticsearch 搜索引擎 https://github.com/elastic/elasticsearch
LogStash 日志收集工具 https://github.com/elastic/logstash
Kibana 日志可视化查看工具 https://github.com/elastic/kibana
Nginx 静态资源服务器 https://www.nginx.com/
Docker 应用容器引擎 https://www.docker.com
Jenkins 自动化部署工具 https://github.com/jenkinsci/jenkins
Hikari 数据库连接池 https://github.com/brettwooldridge/HikariCP
JWT JWT登录支持 https://github.com/jwtk/jjwt
Lombok Java语言增强插件 https://github.com/rzwitserloot/lombok
Hutool Java工具类库 https://github.com/looly/hutool
Swagger-UI API文档生成工具 https://github.com/swagger-api/swagger-ui
Knife4j Swagger 增强框架 https://doc.xiaominfo.com
Hibernator-Validator 验证框架 http://hibernate.org/validator
XXL-Job 分布式定时任务框架 http://www.xuxueli.com/xxl-job
ShardingSphere 分库分表 https://shardingsphere.apache.org

正确学习的路线

由于项目中设计到的业务和技术都比较复杂,避免小伙伴像无头苍蝇一样没有学习顺序,这里介绍学习的路线大纲,小伙伴可以按照提供的路线来进行学习

由于大家的需求各不相同,有的人时间不是很紧张,想好好的把整个项目吃透。而有的人想短时间内快速掌握项目的核心亮点,来进行面试,针对不同需求列举出不同的路线

时间充裕想学习整个流程的小伙伴

针对于这种学习类型的,那么就可以 按照整个文档从上至下的来学习 就可以了,本人已经整理好每个章节以及每个章节内的文档顺序了,从上之下的学习顺序为

  1. 项目概要介绍
  2. 项目启动介绍
  3. 项目基础讲解
  4. 架构配置讲解
  5. 详细业务讲解
  6. 架构组件讲解
  7. 技术精华讲解
  8. 深挖细节亮点,轻松俘获面试官
  9. 项目总结

小伙伴在学习 详细业务讲解 的章节时,如果业务中涉及到了的相应的技术和封装的组件,文档中会有专门的跳转链接来直接调转到对应的技术精华架构组件两个章节的对应位置,这也是为了方便学习时更加的有顺序性,将使用和设计直接串联起来

完整目录

image-9900c7ef

尽快掌握核心流程完成突击的小伙伴

对于这些小伙伴的想法是自己的时间有限,想尽可能快速的了解项目,然后先掌握核心技术亮点,将最主要的学会,也是便于应付面试。所以针对于这种学习方式是要带着存在问题的心态来学习的,然后业务加技术相结合,这样就会事半功倍

这里我将痛点、难点以及值得思考的问题梳理出来,希望小伙伴带着这些问题来思考、来学习此项目

  1. 用户服务如何设计分库分表,存在用户邮箱、用户手机号多种方式登录,要怎么设计?
  2. 当一瞬间有大量的用户注册请求时,如何防止服务可能产生崩溃问题,而且不影响用户体验?
  3. 如何设计缓存策略?采取哪种结构来存储?采取哪种维度来存储?哪些数据适合放入缓存?哪些不适合?
  4. 如何应对高并发下的用户查询请求?在主页列表、类型列表、的请求查看下,如何将设计分库分表的数据查询方案?
  5. 节目详情要怎么设计缓存?有了Redis就可以了吗?突发性流量激增的问题怎么解决?
  6. 如何设计多级缓存来应对几十万,甚至几百万的访问压力?如何发生了缓存雪崩要解决解决和提前预防?
  7. 如何应对高并发下的用户购票压力?在购票流程中怎么考虑缓存和数据库的交互?
  8. 库存数量在缓存中应该如何设计?用户购票和支付过程中,要怎么正确的扣除库存?异常了怎么回滚?数据库中的余票数量一致性要如何解决?
  9. 分布式锁使用起来的细节到底有哪些?只要加上一行锁就可以了吗?
  10. 高并发下的分布式锁如何进一步的优化?锁的粒度?网络请求的性能?
  11. 幂等功能如何实现?有哪些维度需要考虑?
  12. 经典的缓存数据库一致性的问题实际生产环境中到底如何解决?直接删除缓存、延迟双删 这些方案到底可行吗?
  13. 高并发下订单延迟关闭功能如何实现?使用中间件作为延迟队列的问题?使用redis作为延迟队列可以吗?如何提高性能?
  14. 分布式id如何生成?经典的雪花算法?直接使用MybatisPlus中的生成策略可以吗?有什么问题?
  15. 订单的分库分表如何设计?既要支持订单详情查询、又要支持订单列表查询而不发生读扩散?
  16. 如何执行灵活的限流规则?能支持到某个时间段、某个请求、并能记录下异常行为信息?
  17. 项目的架构配置、服务配置、数据结构要如何统一设计和管理?异常如何捕获?
  18. 微服务的中间件直接使用可以吗?有哪些方面要考虑?
  19. 上千个微服务项目的情况下,发生问题如何排查?如何准确查找请求链路?直接用SKywalking就解决了没有如何问题吗?
  20. 真实环境中,项目的灰度到如何实现滚动且丝滑发布?
  21. ... ...

这里只是将常见的问题列举了一下,实际项目中解决的问题远不止这些,小伙伴在学习时带着某个问题来思考,找到相应的章节来学习。并且项目中的方案不仅仅只是在本项目中,小伙伴也可以把这些方案带入到自己的项目中解决目前存在的痛点

学习的章节

心中有了问题后,就可以开始学习了,这里将核心功能和技术列举出来,小伙伴如果时间仍然不充裕的话,也不需要将下面的核心的功能全部学会,可以根据自己的能力来选择学习就好

项目概要介绍
项目启动讲解
核心功能学习
核心细节亮点学习

将上述的这些核心功能都学习了后,出去面试已经没有什么问题了,剩下的就是如何将项目写到简历中了,这里本人也写好了项目的简历模块,小伙伴可直接拿来套用

到底应该如何将大麦项目写入简历中

项目学习到什么程度?

有的小伙伴会有以下的疑问:

  1. 就是具体的实现代码不会写,但是我看视频知道,哪一块内容用什么东西解决什么问题
  2. 有没有什么高效学习项目方法,或者详细顺序,我现在就是看视频讲然后学习,把星哥视频内容自己总结一下,写到文档上,有时候视频有不懂的地方,我先记下来
  3. 我还想问一下,项目学到什么程度,面试的时候问项目就没什么问题了,是面试官问我你这个怎么实现然后我回答解决方法吗?
  4. 还有就是大麦项目的代码需不需要自己敲一遍

我的回答是:

  1. 自己写不出来那就是不会
  2. 先学习业务再学习组件设计,不要陷入细节中,学习业务后,自己试着写出来,不要求和项目中一模一样,原理会了就可以
  3. 你简历描述负责的内容面试回答没有问题的程度
  4. 你简历上描述负责的内容需要自己写一遍

另外本人还负责小伙伴后续的面试问题,虽然文档已经将项目讲解的非常全面了,但还是不排除面试官问到的问题没有讲解到的情况出现,小伙伴可以把面试中遇到的问题发布到社区中,本人会对这些问题进行详细的解答。

大麦pro版本功能介绍

对于刚开始学习的小伙伴,要把普通版本的功能学习完后,再来学习pro版本的内容!否则会学的不明白,比较吃力!

到目前为止,大麦项目已经帮助很多的小伙伴拿到了心仪的offer,光大厂就包括腾讯、字节、美团、快手、阿里等。除了项目的质量过硬之外,也要靠小伙伴本身的努力才可以。

damai_pro版本

我们都知道想进大厂难度确实比较高,有些小伙伴去面试虽然是实习生岗位,但依然会问你很刁钻的问题,来考验你的技术能力到底如何?

而我辅导的小伙伴就有不少人问到了架构方面的问题,就比如在项目的运行时,就会被问到:

  • Redis宕机了怎么办?
  • MQ宕机了怎么办?
  • MQ消息丢失了怎么办?
  • MQ消息延迟消费了怎么办?
  • 数据库的余票数量和Redis中的不一致怎么办?
  • Redis恢复后,丢失的数据要怎么恢复?

等等一系列的这种令人头疼的问题!之前的 damai项目关于这方面的问题有做过处理,但有些是人工处理,没有实现全面的自动化,有的面试官听着感觉比较普通,没有给人十足的亮点。

所以针对上述说的这种疑难杂症,特意开发出了damai项目的升级版本:damai_pro

damai_pro是在原有的damai项目做了一次重大的升级!不仅保留了原有的功能,而且在此基础上添加了很多新的解决方案。

甭管是Redis宕机了、MQ宕机了、Redis和数据库不一致了、Redis恢复丢失的数据了,等等。。。

这些所有的问题全部在damai_pro版本中得到解决!

都是真实生产环境使用的实际落地解决方案,完完全全经得起考证

为的就是让小伙伴去面试时,能做到无论面试问什么,问的多么的抠细节,用damai_pro项目全都能回答上来!

细节的优化

damai_pro除了解决上述提到的各种中间件宕机和数据库丢失的问题外,还对原有的逻辑进一步做了优化,将逻辑进行再次解耦,学习起来更加的清晰!

并且在数据方面也升级了可靠性,做到 应该高可用的业务,那就高可用。 应该强一致性的业务,那就强一致性。解决之前数据在极端的情况下可能会丢失的问题。

对于刚开始学习的小伙伴,要把普通版本的功能学习完后,再来学习pro版本的内容!否则会学的不明白,比较吃力!到目前为止,大麦项目已经帮助很多的小伙伴拿到了心仪的offer,光大厂就包括腾讯、字节、美团、快手、阿里等。除了项目的质量过硬之外,也要靠小伙伴本身的努力才可以。damai_pro版本我们都知道想进大厂难度确实比较高,有些小伙伴去面试虽然是实习生岗位,但依然会问你很刁钻的问题,来考验你的技术能力到底如何?而我辅导的小伙伴就有不少人问到了架构方面的问题,就比如在项目的运行时,就会被问到:Redis宕机了怎么办?MQ宕机了怎么办?MQ消息丢失了怎么办?MQ消息延迟消费了怎么办?数据库的余票数量和Redis中的不一致怎么办?Redis恢复后,丢失的数据要怎么恢复?等等一系列的这种令人头疼的问题!之前的 damai项目关于这方面的问题有做过处理,但有些是人工处理,没有实现全面的自动化,有的面试官听着感觉比较普通,没有给人十足的亮点。所以针对上述说的这种疑难杂症,特意开发出了damai项目的升级版本:damai_prodamai_pro是在原有的damai项目做了一次重大的升级!不仅保留了原有的功能,而且在此基础上添加了很多新的解决方案。甭管是Redis宕机了、MQ宕机了、Redis和数据库不一致了、Redis恢复丢失的数据了,等等。。。这些所有的问题全部在damai_pro版本中得到解决!都是真实生产环境使用的实际落地解决方案,完完全全经得起考证为的就是让小伙伴去面试时,能做到无论面试问什么,问的多么的抠细节,用damai_pro项目全都能回答上来!细节的优化damai_pro除了解决上述提到的各种中间件宕机和数据库丢失的问题外,还对原有的逻辑进一步做了优化,将逻辑进行再次解耦,学习起来更加的清晰!并且在数据方面也升级了可靠性,做到 应该高可用的业务,那就高可用。 应该强一致性的业务,那就强一致性。解决之前数据在极端的情况下可能会丢失的问题。damai_pro项目的申请damai_pro项目是本人花费了很多的精力才开发出来的,同时也为了更好的保护已经加入星球的小伙伴的权益。所以决定damai_pro项目不再进行开源,而是将项目放到了私有库中。普通版本的damai项目依然还是正常开源,本人也依然会继续进行优化。开源地址为: 👉 点击这里跳转到damai项目已经加入星球的小伙伴,可以按照以下指示来申请和学习damai_pro项目:👉 点击这里学习damai_pro项目


企业级项目导航:⬅️ 05-项目的亮点梳理 | 06-项目入手整体介绍 项目架构亮点学习方法 | ➡️ 07-到底应该如何将大麦项目写入简历中